package org.example.core;

import java.io.IOException;

/**
 * 文件系统核心类
 */
public class FileSystem {
    private boolean initialized = false; // 文件系统是否初始化完成
    private DiskEmulator diskEmulator; // 磁盘模拟器，用于读写磁盘块
    private FATManager fatManager; // FAT管理器，用于管理文件分配表
    public static final int ROOT_DIR_BLOCK = 2; // 根目录块号

    public FileSystem() {
        initialize();
    }

    /**
     * 初始化文件系统
     */
    private void initialize() {
        try {
            System.out.println("初始化文件系统...");

            // 创建磁盘模拟器
            diskEmulator = new DiskEmulator("disk.img");
            System.out.println("磁盘模拟器初始化完成: " +
                    diskEmulator.getBlockCount() + " 块, " +
                    diskEmulator.getBlockSize() + " 字节/块");

            // 初始化FAT表和根目录
            fatManager = new FATManager(diskEmulator);

            initializeRootDirectory(); // 初始化根目录

            initialized = true; // 文件系统初始化完成
            System.out.println("文件系统初始化完成");

        } catch (IOException e) {
            System.err.println("文件系统初始化失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public boolean isInitialized() {
        return initialized;
    }

    public DiskEmulator getDiskEmulator() {
        return diskEmulator;
    }

    public void shutdown() {
        try {
            if (diskEmulator != null) {
                diskEmulator.close();
            }
            System.out.println("文件系统已安全关闭");
        } catch (IOException e) {
            System.err.println("关闭文件系统时出错: " + e.getMessage());
        }
    }

    /**
     * 初始化根目录
     */
    private void initializeRootDirectory() {
        try {
            // 读取根目录块
            byte[] rootBlock = diskEmulator.readBlock(ROOT_DIR_BLOCK);

            // 检查是否需要初始化根目录
            boolean needsInitialization = true;
            for (int i = 0; i < 8; i++) {
                byte[] entryData = new byte[8];
                System.arraycopy(rootBlock, i * 8, entryData, 0, 8);

                DirectoryEntry entry = DirectoryEntry.fromBytes(entryData);
                if (!entry.isEmpty()) {
                    needsInitialization = false;
                    break;
                }
            }

            // 如果需要初始化，则创建空的根目录
            if (needsInitialization) {
                System.out.println("初始化根目录...");
                for (int i = 0; i < 8; i++) {
                    DirectoryEntry emptyEntry = DirectoryEntry.createEmpty();
                    byte[] entryData = emptyEntry.toBytes();
                    System.arraycopy(entryData, 0, rootBlock, i * 8, 8);
                }
                diskEmulator.writeBlock(ROOT_DIR_BLOCK, rootBlock);
                System.out.println("根目录初始化完成");
            } else {
                System.out.println("根目录已存在，无需初始化");
            }

        } catch (Exception e) {
            System.err.println("初始化根目录失败: " + e.getMessage());
            e.printStackTrace();
        }
    }


    // 添加获取FAT管理器的方法
    public FATManager getFatManager() {
        return fatManager;
    }

}
